package pl.egraveyard.util;

import org.springframework.util.StringUtils;

import pl.egraveyard.dao.SlMiejscowoscDao;
import pl.egraveyard.domain.SlMiejscowosc;

/**
 * Klasa narzedziowa z funkcjami pomocniczymi dotyczacymi walidacji danych  w formularzach
 * @author gunos
 *
 */
public final class ValidationUtil {
	private static final String ZIP_REGEXP = "\\d{2,2}-\\d{3,3}";
	private SlMiejscowoscDao slMiejscowoscDao;
	/**
	 * @param slMiejscowoscDao the slMiejscowoscDao to set
	 */
	public void setSlMiejscowoscDao(SlMiejscowoscDao slMiejscowoscDao) {
		this.slMiejscowoscDao = slMiejscowoscDao;
	}

	/**
	 * Domyslny konstruktor
	 */
	private ValidationUtil(){	
	}
	
	/**
	 * Sprawdza poprwnosc sformatowania polskiego kodu pocztowego
	 * @param zip kod do zbadania
	 * @return true jezeli kod jest poprawny
	 */
	public Boolean checkZipCode(String zip){
		if(StringUtils.hasText(zip) && zip.matches(ZIP_REGEXP)){
			return Boolean.TRUE;
		}
		return Boolean.FALSE;
	}
	
	/**
	 * Sprawdza czy dany kod pocztowy jest poprawny dla danego miasta
	 * @param zip kod pocztowy do sprawdzenia
	 * @param cityCode kod miasta
	 * @return true jezeli kod przypisany jest do podanego mista
	 */
	public Boolean isZipInCity(String zip, String cityCode){
		if(StringUtils.hasText(zip) && StringUtils.hasText(cityCode)){
			SlMiejscowosc city = this.slMiejscowoscDao.read(cityCode);
			if(city != null){
				Integer bottomFirstPart = Integer.parseInt(city
						.getKodPocztowyZakresDolny().split("-")[0]);
				Integer bottomSecondPart = Integer.parseInt(city
						.getKodPocztowyZakresDolny().split("-")[1]);
				Integer topFirstPart = Integer.parseInt(city
						.getKodPocztowyZakresGorny().split("-")[0]);
				Integer topSecondPart = Integer.parseInt(city
						.getKodPocztowyZakresGorny().split("-")[1]);
				Integer testFirstPart = Integer.parseInt(zip.split("-")[0]);
				Integer testSecondPart = Integer.parseInt(zip.split("-")[1]);
				if(testFirstPart <= topFirstPart && testFirstPart >= bottomFirstPart
						&& testSecondPart <= topSecondPart && testSecondPart >= bottomSecondPart){
					return Boolean.TRUE;
				}

			}
		}
		return Boolean.FALSE;
	}
}
